package com.lemon.core.common.lang.util;

import com.lemon.core.common.lang.annotation.Nullable;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @desc: lottery-common-web
 * @author: 柠檬的柠丶
 * @createTime: 2018年8月31日 下午3:28:20
 * @history:
 * @version: v1.0
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {

	/**
	 * 判断object为null或者空
	 * @param object 对象
	 * @return
	 */
	public static boolean isNullOrEmpty(@Nullable Object object) {
		return object == null || "".equals(object.toString());
	}

	public static boolean hasLength(@Nullable String str) {
		return (str != null && !str.isEmpty());
	}

	public static boolean hasText(@Nullable String str) {
		return (str != null && !str.isEmpty() && containsText(str));
	}

	private static boolean containsText(@Nullable CharSequence str) {
		int strLen = str.length();
		for (int i = 0; i < strLen; i++) {
			if (!Character.isWhitespace(str.charAt(i))) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 下划线字符串转驼峰字符串
	 * @param str
	 * @return
	 */
	public static String toCamel(String str) {
		//利用正则删除下划线，把下划线后一位改成大写
		Pattern pattern = Pattern.compile("_(\\w)");
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer(str);
		if (matcher.find()) {
			sb = new StringBuffer();
			//将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。
			//正则之前的字符和被替换的字符
			matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
			//把之后的也添加到StringBuffer对象里
			matcher.appendTail(sb);
		} else {
			return sb.toString();
		}
		return toCamel(sb.toString());
	}

	/**
	 * 驼峰字符串转下划线字符串
	 * @param str
	 * @return
	 */
	public static String toUnderline(String str) {
		Pattern pattern = Pattern.compile("[A-Z]");
		Matcher matcher = pattern.matcher(str);
		StringBuffer sb = new StringBuffer(str);
		if(matcher.find()) {
			sb = new StringBuffer();
			//将当前匹配子串替换为指定字符串，并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到一个StringBuffer对象里。
			//正则之前的字符和被替换的字符
			matcher.appendReplacement(sb, "_" + matcher.group(0).toLowerCase());
			//把之后的也添加到StringBuffer对象里
			matcher.appendTail(sb);
		}else {
			return sb.toString();
		}
		return toUnderline(sb.toString());
	}
}
